<?php

namespace Application\Model\DBO;

use Zend\Db\TableGateway\AbstractTableGateway;
use Admin\Model\DBO\BorrowReturnDBO;
use Admin\Model\DBO\SearchBookDBO;
use Admin\Entity\Reader;
use Application\Entity\UpdateReader;

class ProcessReaderDBO extends AbstractTableGateway {

    private $sm;
    private $readerTable;
    private $serialBookTable;
    private $ciculationTable;
    private $userTable;

    public function __construct($serviceManager) {
        $this->sm = $serviceManager;
    }

    public function getSerialBookTable() {
        if (!$this->serialBookTable) {
            $this->serialBookTable = $this->sm->get('Admin\Model\DAO\SerialBookTable');
        }
        return $this->serialBookTable;
    }

    public function getReaderTable() {
        if (!$this->readerTable) {
            $this->readerTable = $this->sm->get('Admin\Model\ReaderTable');
        }
        return $this->readerTable;
    }

    public function getUserTable() {
        if (!$this->userTable) {
            $this->userTable = $this->sm->get('Admin\Model\UserTable');
        }
        return $this->userTable;
    }

    public function getCiculationTable() {
        if (!$this->ciculationTable) {
            $this->ciculationTable = $this->sm->get('Admin\Model\DAO\CiculationTable');
        }
        return $this->ciculationTable;
    }

    /*
     * Lấy danh sách các tài liệu bạn đọc đang mượn
     */

    public function getListBookBorrow($cardBarcode) {
        $objectBorrowReturn = new BorrowReturnDBO($this->sm);
        $resultSet = $objectBorrowReturn->searchInfoBookBorrow($cardBarcode);
        $objectSearchBook = new SearchBookDBO($this->sm);
        // Tim kiếm tác gả dựa vào mã sách
        $allAuthor = array();
        foreach ($resultSet as $key) {
            $bookBarcodeTmp = $key['bookBarcode'];
            $stringAuthor = "";
            $authors = $objectSearchBook->searchBookAuthor($bookBarcodeTmp);
            foreach ($authors as $author) {
                $stringAuthor .= $author['author'] . '-';
            }
            $allAuthor[$bookBarcodeTmp] = $stringAuthor;
        }
        $iteratorAdapter = new \Zend\Paginator\Adapter\Iterator($objectBorrowReturn->searchInfoBookBorrow($cardBarcode));
        $paginator = new \Zend\Paginator\Paginator($iteratorAdapter);
        return array(
            'allAuthor' => $allAuthor,
            'paginator' => $paginator,
        );
    }

    /*
     * Gia hạn sách mượn cho bạn đọc với mã sách tương ứng
     * @param: $dataBook
     * @return: $boolean
     */

    public function addTimeBorrow($dataBook) {
        // tách bookBarcode và serial từ $dataBook
        $dataBook = explode('-', $dataBook);
        if (isset($dataBook[1])) {
            $bookBarcode = $dataBook[0];
            $serial = $dataBook[1];
            // lấy số lần gia hạn từ bảng chính sách lưu thông
            $ciculationPolicy = $this->getReaderTable()->getCirculationPolicy('SLGH');
            // get bookInfor
            $bookInfo = $this->getSerialBookTable()->getInfoBook($bookBarcode, $serial);
            $dateReturn = $bookInfo['dateReturn'];
            $currentDate = date('Y-m-d');
            // Neu so lần gia hạn không lớn hơn chính sách lưu thông và còn thời gian gia hạn thì có thể gia han
            if ($bookInfo['addTime'] < $ciculationPolicy['amount'] && strtotime($currentDate) < strtotime($dateReturn)) {
                // Set lai ngay tra va so lan gia han tang len 1
                $timeAdd = $this->getReaderTable()->getCirculationPolicy('TGGH');
                $dateReturn = new \DateTime($dateReturn);
                date_add($dateReturn, date_interval_create_from_date_string($timeAdd['amount'] . 'days'));
                $dateReturn = $dateReturn->format('Y-m-d');
                $addTime = $bookInfo['addTime'] + 1;
                $this->getCiculationTable()->updateRow($bookInfo['bookID'], array('dateReturn' => $dateReturn, 'addTime' => $addTime));
                return true;
            }
        }
        return false;
    }

    public function changePassword($cardBarcode, $newPass) {
        // b1: getUserID 
        $reader = $this->getReaderTable()->getReader($cardBarcode);
        // b2: change password
        if (isset($reader['userID']) && $reader['userID'] != null) {
            $this->getUserTable()->updatePasswordUser($reader['userID'], $newPass);
            return true;
        }
        return false;
    }

    public function getInfoReader($cardBarcode) {
        return $this->getReaderTable()->getInfoReader($cardBarcode);
    }

    /*
     * Cập nhật các trường trong bảng cơ sở dữ liệu usersTable
     * @param: array $data, $userID
     * @result: boolean
     */

    public function updateInfoUser(Reader $reader, $userID) {
        $data = array(
            'birthday' => $reader->birthday,
            'sex' => $reader->sex,
            'email' => $reader->email,
            'phoneNumber' => $reader->phoneNumber,
            'residentAddress' => $reader->residentAddress,
            'nativePlace' => $reader->nativePlace,
            'profilePhoto' => $reader->profilePhoto,
            'description' => $reader->description,
        );
        $this->getUserTable()->updateInfoUser($data, $userID);
    }

}

?>
